/**
 *	@file	pm_radio.h
 *	@brief	金銀　ラジオデータコントロール
 *	@author	Miyuki Iwasawa
 *	@date	07.10.18
 */

#ifndef __H_PM_RADIO_H__
#define __H_PM_RADIO_H__

#include "system/wordset.h"
#include "pm_radio_def.h"

///ラジオメインシーケンスNo定義
typedef enum{
 RADIO_MSEQ_STR_INIT,
 RADIO_MSEQ_TIME_WAIT,
 RADIO_MSEQ_STR_PLAY,
 RADIO_MSEQ_SCROLL_WAIT,
 RADIO_MSEQ_END_SCROLL,
 RADIO_MSEQ_END_WAIT,
 RADIO_MSEQ_END,
}RADIO_MSEQ_ID;

///ラジオデータマネージャー
typedef struct{
 int heapID;	///<ヒープID

 SAVEDATA*	save;
 u16		zone_id;	///<自機がいるゾーンID
 u16		field_zone;	///<自機のフィールドゾーン
 GF_BGL_BMPWIN*	win;	///<関連づけられたウィンドウへのポインタ
 GF_BGL_BMPWIN*	win_title;	///<関連づけられたウィンドウへのポインタ
 GF_BGL_BMPWIN*	win_dj;		///<関連づけられたウィンドウへのポインタ
 GF_PRINTCOLOR col;		///<メッセージの描画色

 void*	ch_wk;	///<番組用ワーク取得領域

 MSGDATA_MANAGER* msgMan;	///<メッセージマネージャ
 MSGDATA_MANAGER* msg_prog;	///<プログラムローカルメッセージマネージャ

 RTCDate	date;	//プログラム再生開始時の日時
 RTCTime	time;

 WORDSET* wset;		///<ワーク
 STRBUF* str_tmp;	///<テンポラリバッファ(1行分)
 STRBUF* str_title;	///<テンポラリバッファ(タイトル名取得用)
 STRBUF* str_dj;	///<テンポラリバッファ(DJ名取得用)

 int	pass_work;	///<同一プログラム連続再生(CMは無視)時に引き継げる値
 u8	ch_id;			///<カレントチャンネルID
 u8	prog_id;		///<カレントプログラムID
 u8	old_prog_id;	///<旧プログラムID
 u8	f_col;
 u8	b_col;
 u8	s_col;

 u8	seq;
 u8	sub_seq;
 u8	next_seq;

 u8	msg_no;	///<カレントメッセージナンバー
 u8	line_ct;	///<ラインカウンタ
 u8	line_max;	///<ラインマックス
 u8	line_seq;	///<ライン描画シーケンス
 u8	line_mode;	///<ライン描画モード(1だと最終ラインをスクロールしない)
 u8	fst_f:1;	///<初回フラグ
 u8	rec_lv_f:1;	///<受信強度フラグ
 u8	is_kanto_f:1;	///<今居る位置がカントーかどうか？
 u8	program_end_f:1;	//プログラム終了フラグ
 u8	cm_req_f:1;	//CMリクエストフラグ
 u8	dmy:2;

 u8	mwait_ct;	///<カウンタ
 u8	msg_wait;	///<カウンタ
 u8	swait_ct;
 u8	scroll_ct;
 STRBUF* c_str;		///<カレント文字列
 STRBUF* c_str_tmp;	///<カレント文字列テンポラリ

}PM_RADIO_MAN;

typedef int (*PMRADIO_SEQ_FUNC)(PM_RADIO_MAN* man);

typedef struct{
 PMRADIO_SEQ_FUNC	call_func;
 PMRADIO_SEQ_FUNC	main_func;
 PMRADIO_SEQ_FUNC	end_func;
}PMRADIO_SEQ_TBL;

/**
 *	@brief	ラジオデータのコントロールマネージャを作成
 *
 *	@param	save	セーブデータへのポインタ
 *	@param	zone_id	自機が今居るゾーン
 *	@param	field_zone	自機のフィールド位置上のゾーン
 *	@param	win	ラジオメッセージを表示する初期化済みウィンドウへのポインタ
 *	@param	col	メッセージの描画色
 *	@param	heapID	ワークを確保するheapID
 */
extern PM_RADIO_MAN* PMRadio_Init(SAVEDATA* save,int zone_id,int field_zone,BOOL is_kanto,
		GF_BGL_BMPWIN* win,GF_BGL_BMPWIN* win_title,GF_BGL_BMPWIN* win_dj,GF_PRINTCOLOR col,int heapID);

/**
 *	@brief	ラジオデータコントロールマネージャの破棄
 */
extern void PMRadio_Release(PM_RADIO_MAN* wk);

/**
 *	@brief	ラジオ　番組初期化
 *
 *	@param	prog_id	再生したいチャンネルID
 *	@param	level	初期再生パワー PMRADIO_REC_NORMAL:強、PMRADIO_REC_FEEBLE:弱
 */
extern void PMRadio_ProgramCall(PM_RADIO_MAN* wk,PM_RADIO_CHID ch_id,PMRADIO_REC_LEVEL level);

/**
 *	@brief	ラジオ　番組再生終了
 */
extern void PMRadio_ProgramEnd(PM_RADIO_MAN* wk);

/**
 *	@brief	ラジオ　番組再生
 *
 *	@li	メインで呼んでください
 */
extern void PMRadio_ProgramMain(PM_RADIO_MAN* wk);

/**
 *	@brief	ラジオ　電波の強さ変更
 */
extern void PMRadio_ReceptLevelChange(PM_RADIO_MAN* wk,PMRADIO_REC_LEVEL level);

/**
 *	@brief	メッセージスクロール
 */
extern BOOL RadioSub_MsgWaitScroll(PM_RADIO_MAN* man);
extern BOOL RadioSub_MsgScroll(PM_RADIO_MAN* man);

/**
 *	@brief	タイムウェイト
 */
extern BOOL RadioSub_TimeWait(PM_RADIO_MAN* man);

/**
 *	@brief	STRBUF型文字列を受け取り、行単位で描画する
 */
extern int RadioSub_StrWriteSet(PM_RADIO_MAN* man,const STRBUF* str);

/**
 *	@brief	STRBUF型文字列を受け取り、行単位で描画する
 */
extern int RadioSub_StrWrite(PM_RADIO_MAN* man);

/**
 *	@brief	一文再生
 */
extern void RadioSub_SentencePlay(PM_RADIO_MAN* man,u16 str_id);
extern void RadioSub_SentencePlayEx(PM_RADIO_MAN* man,u16 str_id,BOOL line_mode);
extern void RadioSub_EyeCatchPlay(PM_RADIO_MAN* man,u16 str_id);

/**
 *	@brief	一文再生
 */
extern int RadioSub_SentencePlayWait(PM_RADIO_MAN* man);
extern int RadioSub_EyeCatchPlayWait(PM_RADIO_MAN* man);


#include "prog/radio_prog.h"

#endif	//__H_PM_RADIO_H__